\begin{itemize}
	\item{\textbf{Acci\'on:}}
	El objetivo de la funci\'on es combinar una imagen con una imagen de ondas dando tonos m\'as
	oscuros y m\'as claros en forma de onda desde el centro de la imagen en forma conc\'entrica.
	\item{\textbf{Prototipo:}}
	void $ondas$ (unsigned char* $src$, unsigned char* $dst$, int $h$, int $w$, int $row\_size$)
	\item{\textbf{Procedimiento en C:}}
	La implementaci\'on en $C$ fue provista por la C\'atedra.
	\item{\textbf{Procedimiento en ASM:}}
	El proceso de este filtro se realiza a trav\'es de dos ciclos anidados que permiten recorrer
	la imagen en su totalidad.
	El ciclo exterior recorre todas las filas guardando la fila actual en $r12d$, mientras que el
	interior avanza de a 8 columnas guardando la columna base actual en $r13d$.
	Es importante destacar que en caso de no ser el ancho de la imagen m\'ultiplo de 8, la
	\'ultima iteraci\'on se ocupa de desplazarse hacia atr\'as lo necesario para poder leer las
	\'ultimas 8 columnas.
	\\ \hspace*{10pt}
	Antes de iniciar los ciclos, sin embargo, guardamos en los registros $xmm14$ y $xmm15$ cuatro
	copias de y0 y x0 respectivamente para poder utilizarlos luego ahorrando operaciones dentro de
	cada ciclo.
	\\ \hspace*{10pt}
	El primer paso dentro del ciclo corresponde a calcular los $d_x$ y $d_y$ para los 8 pixeles con
	los que trabajaremos. Dado que siempre estamos en la misma fila, resulta que los $d_y$ son
	iguales para todos los pixeles.
	\\
	\\ \hspace*{150pt}
	$xmm3 = r12d$ $|$ $r12d$ $|$ $r12d$ $|$ $r12d$
	\\ \hspace*{150pt}
	$xmm14 = y_0$ $|$ $y_0$ $|$ $y_0$ $|$ $y_0$
	\\
	\\ \hspace*{10pt}
	Para calcular los $d_x$, cargamos los registros $xmm1$ y $xmm2$ con los n\'umeros de 0 al 7, y
	$xmm3$ con cuantro copias de la columna inicial a partir de la cual estamos trabajando ($ebx$).
	\\
	\\ \hspace*{150pt}
	$xmm1 = 3$ $|$ $2$ $|$ $1$ $|$ $0$
	\\ \hspace*{150pt}
	$xmm2 = 7$ $|$ $6$ $|$ $5$ $|$ $4$
	\\ \hspace*{150pt}
	$xmm3 = ebx$ $|$ $ebx$ $|$ $ebx$ $|$ $ebx$
	\\
	\\
	Una vez que sumamos $xmm3$ a $xmm1$ y $xmm2$, obtenemos los $x$ para los 8 pixeles.
	\\
	\\ \hspace*{150pt}
	$xmm1 = ebx+3$ $|$ $ebx+2$ $|$ $ebx+1$ $|$ $ebx$
	\\ \hspace*{150pt}
	$xmm2 = ebx+7$ $|$ $ebx+6$ $|$ $ebx+5$ $|$ $ebx+4$
	\\ \hspace*{150pt}
	$xmm15 = x_0$ $|$ $x_0$ $|$ $x_0$ $|$ $x_0$
	\\
	\\
	Luego de restarles $xmm15$, tenemos los $d_x$ repartidos en $xmm1$ y $xmm2$. An\'alogamente,
	tenemos los $d_y$ en $xmm3$.
	\\
	\\ \hspace*{100pt}
	$xmm1 = ebx+3-x_0$ $|$ $ebx+2-x_0$ $|$ $ebx+1-x_0$ $|$ $ebx-x_0$
	\\ \hspace*{100pt}
	$xmm2 = ebx+7-x_0$ $|$ $ebx+6-x_0$ $|$ $ebx+5-x_0$ $|$ $ebx+4-x_0$
	\\ \hspace*{100pt}
	$xmm3 = r12d-y_0$ $|$ $r12d-y_0$ $|$ $r12d-y_0$ $|$ $r12d-y_0$
	\\
	\\ \hspace*{10pt}
	Luego de convertir estos registros a float con la operaci\'on $cvtdq2ps$, los multiplicamos
	por s\'i mismos con $mulps$ para obtener los cuadrados y aplicamos $sqrtps$ despu\'es de
	sumarlos con $addps$ para obtener $d_{xy} = \sqrt{d_x^2 + d_y^2}$, que estar\'a repartido
	en $xmm1$ y $xmm2$.
	\\ \hspace*{10pt}
	A continuaci\'on cargamos $RADIUS$ y $WAVELENGTH$ en $xmm3$ y $xmm4$ respectivamente para
	calcular $r = \frac{(d_{xy} - RADIUS)}{WAVELENGTH}$ usando $subps$ y $divps$, que estar\'a
	tambi\'en repartido en $xmm1$ y $xmm2$.
	\\ \hspace*{10pt}
	Utilizando la operaci\'on $roundps$ con el par\'ametro 01b para redondear hacia abajo,
	guardamos en $xmm5$ y $xmm6$ $floor(r)$.
	Adem\'as guardamos una copia de $r$ en $xmm3$ y $xmm4$ para utilizarla luego.
	\\ \hspace*{10pt}
	Tras cargar $TRAINWIDTH$ y $\pi$, procedemos a calcular $(\frac{r}{TRAINWIDTH})^2$ para luego
	sumarle 1 y calcular su inversa $a = \frac{1}{1+(\frac{r}{TRAINWIDTH})^2}$, que estar\'a
	repartida en $xmm1$ y $xmm2$.
	\\ \hspace*{10pt}
	Ya disponiendo de $\pi$, $r$ y $floor(r)$, calculamos $t = (r-floor(r))*2*\pi - \pi$ y lo
	guardamos en $xmm3$ y $xmm4$.
	\\ \hspace*{10pt}
	Usando varios registros adicionales, y a trav\'es de sucesivas multiplicaciones y divisiones,
	procedemos a calcular y guardar $\frac{t^3}{6}$ en $xmm5$ y $xmm6$, $\frac{t^5}{120}$ en
	$xmm7$ y $xmm8$, y $\frac{t^7}{5040}$ en $xmm9$ y $xmm10$.
	\\ \hspace*{10pt}
	Sumando y restando estos valores a $t$, antes de multiplicar todo por $a$, obtenemos
	$prof = a * (t - \frac{t^3}{6} + \frac{t^5}{120} - \frac{t^7}{5040})$, guardado en
	$xmm1$ y $xmm2$, para luego multiplicarlo por 64.
	\\ \hspace*{10pt}
	Es reci\'en en este momento que leemos los 8 pixeles de la imagen original para guardarlos en
	$xmm3$ usando la operaci\'on $movq$, y sumarlos a $prof*64$ luego de convertirlos a float a trav\'es de las operaciones
	$pmovzxbd$ y $cvtdq2ps$. Finalmente, $xmm1$ y $xmm2$ guardan $pixel = prof*64 + I_{src}(x,y)$.
	\\ \hspace*{10pt}
	Para terminar, convertimos estos valores a DW a trav\'es de $cvtps2dq$ y aprovechamos las
	operaciones $packssdw$ y $packuswb$ para convertirlos a W y B saturando los
	valores negativos menores a 0 y los n\'umeros mayores a 255 respectivamente.
	\\ \hspace*{10pt}
	As\'i, obtenemos en $xmm1$ los 8 bytes correspondientes a los nuevos pixeles que guardamos en
	la imagen destino a trav\'es de $movq$ antes de iterar.
\end{itemize}
